package com.zishuimuyu.trans.impl;

;

import com.alibaba.fastjson.JSONObject;
import com.zishuimuyu.http.HttpParams;
import com.zishuimuyu.http.HttpPostParams;
import com.zishuimuyu.trans.AbstractOnlineTranslator;
import com.zishuimuyu.trans.LANG;
import com.zishuimuyu.trans.annotation.TranslatorComponent;

/**
 * 使用 @TranslatorComponent 注解标记该类为翻译组件，其唯一标识符为 "jinshan"
 */
@TranslatorComponent(id = "jinshan")
/**
 * 最终的金山翻译器类，继承自 AbstractOnlineTranslator 类。
 * 该类实现了使用金山翻译 API 进行翻译的功能。
 */
final public class JinshanTranslator extends AbstractOnlineTranslator {

    /**
     * 构造函数，用于初始化语言映射。
     * 此方法将内部语言枚举 LANG 映射到金山翻译 API 所支持的语言代码。
     */
    public JinshanTranslator() {
        // 将英文 LANG.EN 映射到金山翻译 API 支持的 "en" 代码
        langMap.put(LANG.EN, "en");
        // 将中文 LANG.ZH 映射到金山翻译 API 支持的 "zh" 代码
        langMap.put(LANG.ZH, "zh");
    }

    /**
     * 重写父类的 getResponse 方法，用于向金山翻译 API 发送请求并获取响应。
     *
     * @param from  源语言，使用 LANG 枚举表示
     * @param targ  目标语言，使用 LANG 枚举表示
     * @param query 需要翻译的文本
     * @return 金山翻译 API 返回的响应字符串
     * @throws Exception 如果在发送请求过程中发生异常
     */
    @Override
    protected String getResponse(LANG from, LANG targ, String query) throws Exception {
        // 创建一个 HttpPostParams 对象，用于构建 POST 请求的参数
        HttpParams params = new HttpPostParams()
                // 添加源语言参数，根据语言映射获取对应的金山翻译 API 代码
                .put("f", langMap.get(from))
                // 添加目标语言参数，根据语言映射获取对应的金山翻译 API 代码
                .put("t", langMap.get(targ))
                // 添加需要翻译的文本参数
                .put("w", query);

        // 发送请求并将响应内容作为字符串返回
        return params.send2String("http://fy.iciba.com/ajax.php?a=fy");
    }

    /**
     * 重写父类的 parseString 方法，用于解析金山翻译 API 返回的 JSON 响应字符串。
     *
     * @param jsonString 金山翻译 API 返回的 JSON 响应字符串
     * @return 解析后的翻译结果字符串
     */
    @Override
    protected String parseString(String jsonString) {
        // 将 JSON 字符串解析为 JSONObject 对象
        JSONObject jsonObject = JSONObject.parseObject(jsonString);
        // 直接从 JSON 对象中获取翻译结果字符串
        return jsonObject.getJSONObject("content").getString("out");
    }
}

